package com.fingard.dsp.bank.directbank.zyb01;

import com.fingard.dsp.bank.directbank.bankInterface.IBalance;
import com.fingard.dsp.bank.reqrespobj.balance.Req7505HisBalQry;
import com.fingard.dsp.bank.reqrespobj.balance.Req7506BalQry;
import com.fingard.dsp.bank.reqrespobj.balance.RetAts7505HisBalQry;
import com.fingard.dsp.bank.reqrespobj.balance.RetAts7506BalQry;
import com.fingard.dsp.bank.reqrespobj.balance.detail.RetAtsBalDetail;
import com.fingard.xml.XmlTextReader;
import com.fingard.xml.XmlTextWriter;

public class ZYB01Balance extends ZYB01Base implements IBalance {

	//单个余额查询和批量余额查询，统一采用流处理方式
	//1、循环调用Req7506BalQry.readRecord()读取一个请求明细，然后写入发银行的XML对象
	//2、发银行
	//3、循环调用XmlTextReader.read()读取一个银行返回节点，赋值返回ATS的明细对象，
	//   然后调用RetAts7506BalQry.writeRetDetail()，写入返回ATS的明细
	public RetAts7506BalQry d_7506_BalQry(Req7506BalQry p_req7506) throws Exception{//余额查询
		//余额查询返回ATS的对象
		RetAts7506BalQry retAts = new RetAts7506BalQry(p_req7506.reqHeader);
		retAts.writeStart();//写返回ATS的统一头部信息
		try {
			//赋值通用参数
			ZYB01Header bankHeader = new ZYB01Header();
			bankHeader.trsCode = "05B2EActBalQry";
			String sidData="0";
			String charsetName = "GBK";
			XmlTextWriter xmlWriter = new XmlTextWriter();//发银行报文的XML对象
			//写入通用的头部节点
			writeCommonHeader(xmlWriter, bankHeader,reqHeader.transSeqID);
			//xmlWriter.writeElementString("TotalNum", String.valueOf(p_req7506.detailCount));
			/*
            <Body>
            <List>
              <Row>
               <AcNo>8006014000000013699</AcNo>
              </Row>
            </List>
           </Body>
           </Message>
			 * */
			xmlWriter.writeStartElement("Body");
			xmlWriter.writeStartElement("List");
			while(p_req7506.readRecord()){
				xmlWriter.writeStartElement("Row");
				xmlWriter.writeElementString("AcNo", p_req7506.readedDetail.actNum);
				xmlWriter.writeEndElement();
			}
			xmlWriter.writeEndElement();
			xmlWriter.writeEndElement();
			xmlWriter.writeEndDocument();
			
			String[] tmpStrRet = sendToBank(xmlWriter.toXmlString(),bankHeader,sidData,charsetName);
			if(tmpStrRet[0].length() == 0){
				StringBuilder tmpSbMsg = new StringBuilder();
				
				XmlTextReader tmpBkReader = loadBankRespXmlReader(tmpStrRet[1], tmpSbMsg);
				
				if(tmpBkReader != null){
					String tmpStatus = tmpBkReader.getFirstText("/Reply_Msg/Sys_Head/IBSReturnCode");
					String tmpStatusText = tmpBkReader.getFirstText("/Reply_Msg/Sys_Head/IBSReturnMsg");
					if(tmpStatus != null && tmpStatus.equals("000000")){
						while(tmpBkReader.read("/Reply_Msg/Body/List/Row")){
							/*<?xml version="1.0" encoding="UTF-8"?>
							<Reply_Msg>
							<Sys_Head>

							</Sys_Head>
							<Body>
							<List>
							<Row>
							<IBSReturnCode>000000</IBSReturnCode>
							<IBSReturnMsg></IBSReturnMsg>
							<AcName></AcName>
							<AcNo>8006014000000013699</AcNo>
							<Balance>695.14</Balance>
							<AvailBal>695.14</AvailBal>
							</Row>
							</List>
							</Body>
							</Reply_Msg>*/
							RetAtsBalDetail tmpRetDetail = new RetAtsBalDetail();
							//tmpRetDetail.actCur = convertCurToATS(tmpBkReader.readedXElement.getSingleText("CurrType"));
							tmpRetDetail.actNum = tmpBkReader.readedXElement.getSingleText("AcNo");
							if(tmpBkReader.readedXElement.getSingleText("IBSReturnCode").equals("000000")){
								tmpRetDetail.respCode = "0";
								tmpRetDetail.availBal = tmpBkReader.readedXElement.getSingleText("AvailBal");
								tmpRetDetail.currBal = tmpBkReader.readedXElement.getSingleText("Balance");
							}
							else{
								tmpRetDetail.respCode = "-1";	
								tmpRetDetail.respInfo = tmpBkReader.readedXElement.getSingleText("IBSReturnCode")+"-"+tmpBkReader.readedXElement.getSingleText("IBSReturnMsg");
							}
							retAts.writeRetDetail(tmpRetDetail, p_req7506.isBatch);
						}
					}
					else{
						retAts.writeRespCode("-1");
						retAts.writeRespInfo(tmpStatusText);
					}
				}
				else{
					retAts.writeRespCode("-1");
					retAts.writeRespInfo(tmpSbMsg.toString());
				}
			}
			else{
				retAts.writeRespCode("-1");
				retAts.writeRespInfo(tmpStrRet[1]);
			}
		} catch (Exception e) {
			retAts.writeRespCode("-1");
			retAts.writeRespInfo(e.getMessage());
			e.printStackTrace();
		}
		retAts.writeEnd();
		return retAts;
	}

	@Override
	public RetAts7505HisBalQry d_7505_BalQry(Req7505HisBalQry p_req7505) throws Exception {
		return null;
	}

}
